<?php

declare(strict_types=1);

namespace app\common\dao\sys;

use app\common\model\sys\SysMenu;
use app\common\traits\DaoTrait;

/**
 * 系统节点菜单
 * @author:kaige
 * @date:2022-06-12
 * @copyright ©2022 泉州市盛筑信息科技有限公司 版权所有
 */
class MenuDao
{
  // 当前操作的模型
  protected $model = null;

  // 对应模型的主键，默认为id
  protected $pk = 'id';

  // 对应模型默认查询的字段
  protected $name = 'name';

  // 对应模型允许查询的字段(默认全部查询)
  protected $allowField = ['*'];

  // 查询结果-要隐藏的字段 默认空数组
  protected $hideField = [];

  // 允许单字段更新
  protected $uaField = [
    'status',
    'is_sys',
    'is_lock',
    'menu_type',
    'open_type',
    'is_left',
    'is_max',
    'is_menu',
    'is_auth',
    'is_login',
    'is_extend',
    'sort',
    'name',
    'menu_id',
    'p_menu_id'
  ];

  public function __construct()
  {
    $this->model = new SysMenu();
  }
  use DaoTrait;

  /**
   * 获取用户角色菜单
   */
  public function getRoleMenuData($roles, $type)
  {
    $where = [];
    if ($type == 1) {
      $where[] = ['o.is_menu', '=', 1];
    } else {
      $where[] = ['o.is_auth', '=', 1];
    }
    $where[] = ['o.type', '<>', 'm'];
    $where[] = ['o.status', '=', 1];
    $where[] = ['urm.user_role_id', 'IN', $roles];
    // 注意一下是 取 id 非 menu_id 需要注意一下
    $list = $this->model->distinct(true)->alias('o')
      ->field('o.*')
      ->join('SysUserRoleMenus urm', 'o.id = urm.menu_id')
      ->where($where)
      ->order('o.sort asc')
      ->select();
    return $list;
  }

  /**
   * 清理无效的节点记录
   * @param array $nodes 系统节点
   */
  public function clearNode($nodes)
  {
    return $this->model->where('is_sys', 0)->whereNotIn('node', $nodes)->delete();
  }

  /**
   * 保存节点
   * @param array $data
   * @return bool
   */
  public function saveNode($data)
  {
    $where = ['node' => $data['node']];
    $nmodel = $this->model->where($where)->find();
    if ($nmodel) {
      if ($nmodel->save($data)) {
        return true;
      };
    } else {
      $imodel = new SysMenu();
      if ($imodel->save($data)) {
        return true;
      };
    }
    return false;
  }
}
